use std::{cell::Cell , fmt::{Debug}} ;
use std::fmt::Formatter;
use std::ops::Deref;

pub struct SyncCell<T: ?Sized> (Cell<T>);


//只有 T 满足Sync才能跨线程共享  否则跨线程使用会失败
unsafe impl <T : ?Sized + Sync> Sync for SyncCell<T> {}

impl<T> SyncCell<T> {
    #[inline]
    pub const fn new(value : T) -> Self {
        Self(Cell::new(value))
    }
}


impl<T : Default> Default for SyncCell<T> {
    fn default() -> Self {
        Self::new(T::default()) 
    }
} 

impl <T> Deref for SyncCell<T> {
    type Target = Cell<T>; 
    #[inline] 
    fn deref(&self) -> &Self::Target{
        &self.0
    } 
}

// 你依然可以将非Clone的T装进到SyncCell中，只是无法对SyncCell本身调用clone
impl <T : Copy> Clone for SyncCell<T> {
    #[inline]
    fn clone(&self) -> Self {
        SyncCell::new(self.get()) 
    }
}

impl<T : Copy + Debug> Debug for SyncCell<T> {
    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
        Debug::fmt(&self.get(),f)
    }
}